package router

import (
	"net/http"
	v1 "wms/api/v1"
	"wms/internal/middleware"
	"wms/pkg/global"

	"github.com/gin-gonic/gin"
	swaggerFiles "github.com/swaggo/files"
	ginSwagger "github.com/swaggo/gin-swagger"
)

// @title WMS仓储管理系统 API
// @version 1.0
// @description WMS仓储管理系统的API文档
// @host localhost:8080
// @BasePath /api/v1
// @securityDefinitions.apikey Bearer
// @in header
// @name Authorization

// InitRouter 初始化路由
func InitRouter() *gin.Engine {
	r := gin.Default()

	// 全局中间件
	r.Use(middleware.Cors())         // 跨域
	r.Use(middleware.OperationLog()) // 操作日志

	// API文档
	r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))

	// 静态文件服务
	r.Static("/static", "./static")

	// 404处理
	r.NoRoute(func(c *gin.Context) {
		c.JSON(http.StatusNotFound, gin.H{
			"code": 404,
			"msg":  "访问路径不存在",
		})
	})

	// API路由组
	api := r.Group("/api/v1")

	// 公开路由
	{
		auth := v1.NewUserController()
		api.POST("/auth/login", auth.Login)   // 用户登录
		api.POST("/auth/logout", auth.Logout) // 用户登出

		upload := v1.NewUploadController()
		api.POST("/upload/image", upload.UploadImage) // 文件上传
	}

	// 认证路由
	private := api.Group("")
	private.Use(middleware.JWTAuthMiddleware())
	{
		// 创建日志控制器实例 - 在所有需要用到的路由组之前创建
		logController := v1.NewLogController()
		systemLogController := v1.NewSystemLogController() // 新增系统日志控制器

		// 用户管理
		users := private.Group("/users")
		{
			c := v1.NewUserController()

			// 特殊路径 - 必须放在最前面，避免被/:id捕获
			users.GET("/info", c.GetCurrentUserInfo) // 获取当前用户信息
			users.PUT("/password", c.UpdatePassword) // 修改密码
			users.PUT("/profile", c.Profile)         // 更新信息
			users.POST("/avatar", c.UploadAvatar)    // 上传头像
			users.DELETE("/cache", c.ClearCache)     // 清除缓存
			users.PUT("/homepage", c.SetHomePage)    // 设置首页
			users.GET("/recycle", c.GetRecycleList)  // 回收站
			users.DELETE("/batch", c.BatchDelete)    // 批量删除
			users.DELETE("/real", c.RealDelete)      // 真实删除
			users.PUT("/recovery", c.Recovery)       // 恢复用户
			users.PUT("/status", c.SetStatus)        // 设置状态

			// 标准CRUD操作
			users.GET("", c.GetList) // 用户列表
			users.POST("", c.Create) // 创建用户

			// 带ID参数的API必须放在最后
			users.GET("/:id", c.GetInfo)   // 用户详情
			users.PUT("/:id", c.Update)    // 更新用户
			users.DELETE("/:id", c.Delete) // 删除用户
		}

		// 角色管理
		roles := private.Group("/roles")
		{
			c := v1.NewRoleController()
			roles.GET("", c.GetRoleList)                           // 列表
			roles.POST("", c.CreateRole)                           // 创建
			roles.GET("/:id", c.GetRoleDetail)                     // 详情
			roles.PUT("/:id", c.UpdateRole)                        // 更新
			roles.DELETE("/:id", c.DeleteRole)                     // 删除
			roles.GET("/:id/permissions", c.GetRolePermissions)    // 获取权限
			roles.PUT("/:id/permissions", c.UpdateRolePermissions) // 更新权限
		}

		// 菜单管理
		menus := private.Group("/menus")
		{
			c := v1.NewMenuController()
			menus.GET("", c.List)              // 列表
			menus.POST("", c.Create)           // 创建
			menus.GET("/:id", c.Get)           // 详情
			menus.PUT("/:id", c.Update)        // 更新
			menus.DELETE("/:id", c.Delete)     // 删除
			menus.GET("/user", c.GetUserMenus) // 用户菜单
		}

		// 仓库管理
		warehouses := private.Group("/warehouses")
		{
			c := v1.NewWarehouseController()
			// 仓库基础操作
			warehouses.GET("", c.List)          // 列表
			warehouses.POST("", c.Create)       // 创建
			warehouses.GET("/:id", c.Get)       // 详情
			warehouses.PUT("/:id", c.Update)    // 更新
			warehouses.DELETE("/:id", c.Delete) // 删除

			// 添加获取可用库位路由
			warehouses.GET("/:id/available-locations", c.ListAvailableLocations) // 获取可用库位

			// 货位管理
			locations := warehouses.Group("/locations")
			{
				locations.GET("", c.ListLocations)                    // 列表
				locations.GET("/available", c.ListAvailableLocations) // 可用货位列表
				locations.POST("", c.CreateLocation)                  // 创建
				locations.GET("/:id", c.GetLocation)                  // 详情
				locations.PUT("/:id", c.UpdateLocation)               // 更新
				locations.DELETE("/:id", c.DeleteLocation)            // 删除
			}
		}

		// 货物管理
		cargos := private.Group("/cargos")
		{
			c := v1.NewCargoController()
			// 货物基础操作
			cargos.GET("", c.List)      // 列表
			cargos.POST("", c.Create)   // 创建
			cargos.GET("/:id", c.Get)   // 详情
			cargos.PUT("", c.Update)    // 更新
			cargos.DELETE("", c.Delete) // 删除

			// 添加批量获取货物接口
			cargos.GET("/batch", c.GetBatchCargos) // 批量获取货物

			// 货物分类
			categories := cargos.Group("/categories")
			{
				categories.GET("", c.ListCategories)        // 列表
				categories.POST("", c.CreateCategory)       // 创建
				categories.PUT("", c.UpdateCategory)        // 更新
				categories.DELETE("/:id", c.DeleteCategory) // 删除
				categories.GET("/:id", c.GetCategory)       // 详情
			}
		}

		// 单位管理
		units := private.Group("/units")
		{
			c := v1.NewUnitController()
			units.GET("", c.List)      // 列表
			units.POST("", c.Create)   // 创建
			units.GET("/:id", c.Get)   // 详情
			units.PUT("", c.Update)    // 更新
			units.DELETE("", c.Delete) // 删除
		}

		// 库存管理
		inventory := private.Group("/inventory")
		{
			c := v1.NewInventoryController(global.DB, global.Logger)
			// 库存基础操作
			inventory.GET("", c.ListInventory)             // 列表
			inventory.GET("/:id", c.GetInventory)          // 详情
			inventory.POST("/adjust", c.AdjustInventory)   // 调整
			inventory.GET("/alerts", c.GetInventoryAlerts) // 预警

			// 添加库位库存查询接口
			inventory.GET("/locations/:id/inventory", c.GetLocationInventory) // 获取库位库存信息 (新路由)

			// 添加仓库商品库存查询接口
			inventory.GET("/warehouse/:id/products", c.GetWarehouseProducts) // 获取仓库中有库存的商品列表

			// 新增：获取指定产品在各库位的库存信息
			inventory.GET("/product/:id/locations", c.GetProductLocations)

			// 入库管理 (路由指向 InventoryController)
			inbound := inventory.Group("/inbound")
			{
				inbound.GET("/orders", c.ListInbound)                 // 入库单列表 (旧方法名)
				inbound.POST("/orders", c.CreateInbound)              // 创建入库单 (旧方法名)
				inbound.GET("/orders/:id", c.GetInbound)              // 获取入库单详情 (旧方法名)
				inbound.PUT("/orders/:id", c.UpdateInbound)           // 更新入库单 (旧方法名)
				inbound.POST("/orders/:id/receive", c.ReceiveInbound) // 收货
				inbound.POST("/orders/:id/putaway", c.PutawayInbound) // 上架
				// TODO: 添加 CancelInbound Handler 和路由
				inbound.POST("/orders/:id/cancel", c.CancelInbound)      // 取消入库单
				inbound.PUT("/orders/:id/status", c.UpdateInboundStatus) // 更新入库单状态
			}

			// 出库管理 (路由指向 InventoryController)
			outbound := inventory.Group("/outbound")
			{
				outbound.GET("/orders", c.ListOutbound)                    // 出库单列表 (旧方法名)
				outbound.POST("/orders", c.CreateOutbound)                 // 创建出库单 (旧方法名)
				outbound.GET("/orders/:id", c.GetOutbound)                 // 获取出库单详情 (旧方法名)
				outbound.PUT("/orders/:id", c.UpdateOutbound)              // 更新出库单 (旧方法名)
				outbound.POST("/orders/:id/pick", c.PickOutbound)          // 执行拣货操作 (新 Handler)
				outbound.POST("/orders/:id/ship", c.ShipOutbound)          // 执行发货操作 (新 Handler)
				outbound.PUT("/orders/:id/status", c.UpdateOutboundStatus) // 更新出库单状态
				// TODO: 添加 CancelOutbound Handler 和路由
				// outbound.POST("/orders/:id/cancel", c.CancelOutbound)
				// 添加出库统计路由
				outbound.GET("/statistics", c.GetOutboundStatistics)
			}

			// 盘点管理
			check := inventory.Group("/check")
			{
				check.GET("", c.ListInventoryCheck)                   // 列表
				check.POST("", c.CreateInventoryCheck)                // 创建
				check.GET("/:id", c.GetInventoryCheck)                // 详情
				check.POST("/:id/complete", c.CompleteInventoryCheck) // 完成
			}

			// 新增库存列表和详情路由
			inventoryRouter := inventory.Group("inventory")
			{
				// 库存盘点相关路由 (Inventory Check)
				inventoryCheck := inventoryRouter.Group("/checks")
				{
					inventoryCheck.POST("", c.CreateInventoryCheck)               // 创建盘点单
					inventoryCheck.GET("", c.ListInventoryCheck)                  // 获取盘点单列表
					inventoryCheck.GET("/:id", c.GetInventoryCheck)               // 获取盘点单详情
					inventoryCheck.PUT("/:id/complete", c.CompleteInventoryCheck) // 完成盘点单
				}
			}
		}

		// 供应商管理
		suppliers := private.Group("/suppliers")
		{
			c := v1.NewSupplierController()
			suppliers.GET("", c.List)          // 列表
			suppliers.POST("", c.Create)       // 创建
			suppliers.GET("/:id", c.Get)       // 详情
			suppliers.PUT("/:id", c.Update)    // 更新
			suppliers.DELETE("/:id", c.Delete) // 删除
		}

		// 客户管理
		customers := private.Group("/customers")
		{
			c := v1.NewCustomerController()
			customers.GET("", c.List)                 // 列表
			customers.POST("", c.Create)              // 创建
			customers.GET("/:id", c.Get)              // 详情
			customers.PUT("/:id", c.Update)           // 更新
			customers.DELETE("/:id", c.Delete)        // 删除
			customers.DELETE("/batch", c.BatchDelete) // 批量删除
		}

		// 物流管理
		logistics := private.Group("/logistics")
		{
			c := v1.NewLogisticsController()

			// 物流公司
			companies := logistics.Group("/companies")
			{
				companies.GET("", c.ListCompanies)                 // 列表
				companies.POST("", c.CreateCompany)                // 创建
				companies.GET("/:id", c.GetCompany)                // 详情
				companies.PUT("/:id", c.UpdateCompany)             // 更新
				companies.DELETE("/:id", c.DeleteCompany)          // 删除
				companies.DELETE("/batch", c.BatchDeleteCompanies) // 批量删除
			}
		}

		// 系统管理
		system := private.Group("/system")
		{
			c := v1.NewSystemController()
			system.GET("/info", c.GetSystemInfo) // 系统信息

			// 系统日志路由 - 修改为使用新的systemLogController
			system.GET("/logs", systemLogController.GetLogList) // 系统日志
		}

		// 日志管理
		logs := private.Group("/logs")
		{
			// 获取日志类型列表
			logs.GET("/types", logController.GetLogTypes)
			// 获取日志列表
			logs.GET("/list", logController.GetLogList)
			// 导出日志
			logs.GET("/export", logController.ExportLogs)
			// 清空日志
			logs.DELETE("/clear", logController.ClearLogs)
		}

		// 文件上传
		private.POST("/upload", v1.UploadFile)
	}

	return r
}
